package kr.pe.kwonnam.hibernate4memcached.example;
import kr.pe.kwonnam.hibernate4memcached.example.entity.Author;
import org.hibernate.Session;
import org.hibernate.ejb.HibernateEntityManagerFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.Cache;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.List;
import static org.fest.assertions.api.Assertions.assertThat;
/**
* Testing Query Cache
*/
public class QueryCacheTest {
private Logger log = LoggerFactory.getLogger(QueryCacheTest.class);
@Before
public void setUp() throws Exception {
EntityTestUtils.init();
}
@After
public void tearDown() throws Exception {
EntityTestUtils.destroy();
}
private List<Author> getAuthorsWithQuery(String logMessage, String country) {
EntityManager em = EntityTestUtils.start();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Author> cq = cb.createQuery(Author.class);
Root<Author> author = cq.from(Author.class);
cq.select(author);
cq.where(cb.equal(author.get("country"), country));
TypedQuery<Author> query = em.createQuery(cq);
query.setHint("org.hibernate.cacheable", true);
query.setHint("org.hibernate.cacheRegion", "author-by-country");
log.warn("before call {} --", logMessage);
List<Author> beforeResults = query.getResultList();
log.warn("{} : {}", logMessage, beforeResults);
EntityTestUtils.stop(em);
return beforeResults;
}
@Test
public void createQueryCacheAndRetry() throws Exception {
List<Author> beforeResults = getAuthorsWithQuery("Author query", "대한민국");
log.warn("#####################################################################");
List<Author> againResults = getAuthorsWithQuery("Author query again", "대한민국");
assertThat(againResults).isEqualTo(beforeResults);
log.warn("#####################################################################");
}
@Test
public void createQueryCacheAndEvictAllThenRetry() throws Exception {
List<Author> beforeResults = getAuthorsWithQuery("Author query", "어느나라");
log.warn("#####################################################################");
HibernateEntityManagerFactory entityManagerFactory = (HibernateEntityManagerFactory) EntityTestUtils.getEntityManagerFactory();
org.hibernate.Cache cache = entityManagerFactory.getSessionFactory().getCache();
cache.evictEntityRegions();
cache.evictQueryRegions();
cache.evictDefaultQueryRegion();
cache.evictCollectionRegions();
log.warn("just eviected all.");
List<Author> againResults = getAuthorsWithQuery("Author query again after evict all", "어느나라");
assertThat(againResults).isEqualTo(beforeResults);
log.warn("#####################################################################");
}
}